package MyArrayList;
import java.util.Arrays;
import java.util.InputMismatchException;

public class ArrayMethod implements SeqList{

    public int[] array;

    public int usedSize = 0;

    public static int totalSize;//初始数组容量

    public ArrayMethod(int totalSize) {
        ArrayMethod.totalSize = totalSize;
        array = new int[totalSize];
    }



    //判断数组是否放满了
    public void isArrayFull() {
        if (this.usedSize == totalSize) {
            array = Arrays.copyOf(array, ++totalSize);
        }
    }

    // 新增元素,默认在数组最后新增
    @Override
    public void add(int data) {
        this.isArrayFull();
        this.array[this.usedSize] = data;
        this.usedSize++;
    }

    //判断下标是否合法
    public void isPosLegitimate(int pos) throws IsPosLegitimate{
        if (pos < 0 || pos >= this.usedSize) {
            throw new IsPosLegitimate("下标不合法");
        }
    }

    // 在 pos 位置新增元素
    @Override
    public void add(int pos, int data) {
        this.isArrayFull();
        try {
            this.isPosLegitimate(pos);

            for (int i = this.usedSize - 1; i >= pos; i--) {
                array[i + 1] = array[i];
            }

            array[pos] = data;
        } catch (IsPosLegitimate e) {
            e.printStackTrace();
        }
    }

    // 判定是否包含某个元素
    @Override
    public boolean contains(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if (this.array[i] == toFind) {
                return true;
            }
        }
        return false;
    }

    // 查找某个元素对应的位置
    @Override
    public int[] indexOf(int toFind) {
        int[] findPosArray = new int[this.usedSize];

        int count = 0;

        for (int i = 0; i < this.usedSize; i++) {
            if (this.array[i] == toFind) {
                findPosArray[count++] = i;
            }
        }

        return findPosArray;
    }

    //判断数组是否为空数组
    public void isEmptyArray() throws IsEmptyArray {
        if (this.usedSize == 0) {
            throw new IsEmptyArray("数组为空");
        }
    }

    // 获取 pos 位置的元素
    @Override
    public int get(int pos) {
        try {
            this.isPosLegitimate(pos);

            this.isEmptyArray();

            return this.array[pos];
        } catch (IsPosLegitimate e) {
            e.printStackTrace();
        } catch (IsEmptyArray e) {
            e.printStackTrace();
        }

        return -1;
    }

    // 给 pos 位置的元素设为 value
    @Override
    public void set(int pos, int value) {
        try {
            this.isPosLegitimate(pos);

            this.isEmptyArray();

            this.array[pos] = value;
        } catch (IsPosLegitimate e) {
            e.printStackTrace();
        } catch (IsEmptyArray e) {
            e.printStackTrace();
        }

    }

    //删除第一次出现的关键字key
    @Override
    public void remove(int toRemove) {

        try {
            this.isEmptyArray();

            int pos = 0;
            boolean flag = false;

            for (int i = 0; i < this.usedSize; i++) {
                if (array[i] == toRemove) {
                    pos = i;
                    flag = true;
                    break;
                }
            }

            if (flag == false) {
                System.out.println("无该元素");
                return;
            }

            for (int i = pos; i < this.usedSize; i++) {
                array[i] = array[i + 1];
            }

            array[this.usedSize--] = 0;
        } catch (IsEmptyArray e) {
            e.printStackTrace();
        }
    }

    // 获取顺序表长度
    @Override
    public int size() {
        return this.usedSize;
    }

    // 清空顺序表
    @Override
    public void clear() {
        try {
            this.isEmptyArray();

            for (int i = 0; i < this.usedSize; i++) {
                array[i] = 0;
            }

            this.usedSize = 0;
        } catch (IsEmptyArray e) {
            e.printStackTrace();
        }

    }

    // 打印顺序表，注意：该方法并不是顺序表中的方法，为了方便看测试结果给出的
    @Override
    public void display() {
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }
}
